package com.ruyuan.commodity.client;

import com.ruyuan.commodity.api.GoodsClient;
import com.ruyuan.commodity.common.mamager.*;
import com.ruyuan.commodity.domain.*;
import com.ruyuan.commodity.enums.GoodsTypeEnums;
import com.ruyuan.commodity.model.goods.dos.BrandDO;
import com.ruyuan.commodity.model.goods.dos.CategoryDO;
import com.ruyuan.commodity.model.goods.dos.GoodsDO;
import com.ruyuan.commodity.model.goods.dos.GoodsGalleryDO;
import com.ruyuan.commodity.model.goods.dto.GoodsQueryParam;
import com.ruyuan.commodity.model.goods.vo.*;
import com.ruyuan.commodity.open.api.client.exchange.api.ExchangeGoodsOpenApi;
import com.ruyuan.commodity.open.api.client.exchange.domain.ExchangeResponse;
import com.ruyuan.commodity.open.api.model.common.WebPage;
import com.ruyuan.commodity.open.api.model.goods.enums.GoodsType;
import com.scholar.shop.common.CommonRes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;

/**
 * 商品对外的接口实现
 */
@RestController
public class GoodsClientDefaultImpl implements GoodsClient {

    private static final Logger LOG = LoggerFactory.getLogger(GoodsClientDefaultImpl.class);

    /**
     * 商品管理的业务类
     */
    @Autowired
    private GoodsManager goodsManager;
    /**
     * 商品查询的业务类
     */
    @Autowired
    private GoodsInfoQueryManager goodsInfoQueryManager;
    /**
     * 商品SKU管理的业务类
     */
    @Autowired
    private GoodsSkuManager goodsSkuManager;
    /**
     * 商品参数管理的业务类
     */
    @Autowired
    private GoodsParamsManager goodsParamsManager;
    /**
     * 商品分类管理的业务类
     */
    @Autowired
    private CategoryManager categoryManager;
    /**
     * 品牌管理的业务类
     */
    @Autowired
    private BrandManager brandManager;
    /**
     * 商品相册管理的业务类
     */
    @Autowired
    private GoodsInfoGalleryManager goodsInfoGalleryManager;
    /**
     * 商品积分兑换活动的OPEN API
     */
    @Autowired
    private ExchangeGoodsOpenApi exchangeGoodsOpenApi;

    /**
     * 获取新赠商品
     *
     * @param offset 分页偏移量
     * @return 商品信息
     */
    @Override
    public List<BackendGoodsVO> listNewGoods(Integer offset) {
        return goodsManager.newGoods(offset);
    }

    /**
     * 缓存中查询商品的信息
     *
     * @param goodsId 商品id
     * @return 商品信息
     */
    @Override
    public CacheGoods getFromCache(Long goodsId) {
        return goodsInfoQueryManager.getFromCache(goodsId);
    }

    /**
     * 查询sku信息
     *
     * @param skuId 商品SKU id
     * @return 商品SKU信息
     */
    @Override
    public GoodsSkuVO getSku(Long skuId) {
        return this.goodsSkuManager.getSku(skuId);
    }

    /**
     * 查询SKU信息是否存在
     *
     * @param skuId 商品SKU id
     * @return 是否存在
     */
    @Override
    public Boolean checkExist(Long skuId) {
        return this.goodsSkuManager.checkExist(skuId);
    }

    /**
     * 查询多个商品的基本信息
     *
     * @param goodsIds 商品id数组
     * @return 商品选择器结果集
     */
    @Override
    public List<GoodsSelectLine> batchQuery(Long[] goodsIds) {
        return goodsInfoQueryManager.queryGoodsLines(goodsIds, new GoodsQueryParam());
    }

    /**
     * 查询多个sku的基本信息
     *
     * @param skuIds 商品SKU id数组
     * @return 结果集
     */
    @Override
    public List<GoodsSelectLine> querySkus(Long[] skuIds) {
        return this.goodsInfoQueryManager.querySkus(skuIds);
    }

    /**
     * 查询多个商品的基本信息
     *
     * @param goodsIds 商品id数组
     * @return 商品结果集
     */
    @Override
    public List<GoodsDO> queryDo(Long[] goodsIds) {
        return goodsInfoQueryManager.queryDo(goodsIds);
    }

    /**
     * 判断商品是否都是某一商家的商品
     *
     * @param goodsIds 商品id数组
     * @return 判断数组中的商品是否都是属于某一家的商品
     */
    @Override
    public Boolean checkSellerGoodsCount(Long[] goodsIds) {
        try {
            goodsInfoQueryManager.checkSellerGoodsCount(goodsIds);
            return true;
        } catch (Exception e) {
            LOG.error("checkSellerGoodsCount发生异常", e);
            return false;
        }
    }

    /**
     * 查询多个商品的信息和参数信息
     *
     * @param goodsIds 商品id集合
     * @return 商品信息以及商品的参数信息
     */
    @Override
    public List<Map<String, Object>> getGoodsAndParams(Long[] goodsIds) {
        return goodsInfoQueryManager.getGoodsAndParams(goodsIds);
    }

    /**
     * 查询商品信息
     *
     * @param goodsIds 商品id集合
     * @return 商品信息结果集
     */
    @Override
    public List<Map<String, Object>> getGoods(Long[] goodsIds) {
        return goodsInfoQueryManager.getGoods(goodsIds);
    }

    /**
     * 根据商家id查询商家商品的信息和参数信息
     *
     * @param sellerId 商户id
     * @return 结果集
     */
    @Override
    public List<Map<String, Object>> getGoodsAndParamsBySellerId(Long sellerId) {
        return goodsInfoQueryManager.getGoodsAndParams(sellerId);
    }

    /**
     * 按销量查询商品数据
     *
     * @param sellerId 商户id
     * @return 结果集
     */
    @Override
    public List<GoodsDO> listGoodsBySellerId(Long sellerId) {
        return goodsInfoQueryManager.getSellerGoods(sellerId,null);
    }

    /**
     * 缓存中查询sku信息
     *
     * @param skuId 商品SKU ID
     * @return 商品SKU信息
     */
    @Override
    public GoodsSkuVO getSkuFromCache(Long skuId) {
        return goodsSkuManager.getSkuFromCache(skuId);
    }

    /**
     * 查询商品总数
     *
     * @return 商品总数
     */
    @Override
    public Integer queryGoodsCount() {
        return goodsInfoQueryManager.getGoodsCountByParam(null, null, 1);
    }

    /**
     * 根据条件查询商品总数
     *
     * @param status   商品状态
     * @param sellerId 商家id
     * @return 商品总数
     */
    @Override
    public Integer countGoodsNumByStatusAndSellerId(Integer status, Long sellerId) {
        return goodsInfoQueryManager.getGoodsCountByParam(status, sellerId, 1);
    }

    /**
     * 查询未删除商品数量 静态化时使用
     *
     * @return 商品数量
     */
    @Override
    public Integer queryGoodsCountForPageCreate() {
        return goodsInfoQueryManager.getGoodsCountByParam();
    }

    /**
     * 查询某范围的商品信息
     *
     * @param pageNo   页码
     * @param pageSize 每页大小
     * @return 结果集
     */
    @Override
    public List<Map<String, Object>> queryGoodsByRange(Long pageNo, Long pageSize) {
        return goodsInfoQueryManager.queryGoodsByRange(pageNo, pageSize);
    }

    /**
     * 添加商品快照时使用的接口
     *
     * @param goodsId 商品id
     * @return 商品快照的VO类
     */
    @Override
    public GoodsSnapshotVO queryGoodsSnapShotInfo(Long goodsId) {
        //商品
        GoodsDO goods = goodsInfoQueryManager.getModel(goodsId);

        //判断是否为积分商品
        if (GoodsType.POINT.name().equals(goods.getGoodsType())) {
            //积分兑换信息
            CommonRes<ExchangeResponse> response = this.exchangeGoodsOpenApi.getModelByGoods(goodsId);
            if ("success".equals(response.getStatus())) {
                goods.setPoint(response.getData().getExchangePoint());
            }

        }

        //参数
        List<GoodsParamsGroupVO> paramList = goodsParamsManager.queryGoodsParams(goods.getCategoryId(), goodsId);
        //品牌
        BrandDO brand = brandManager.getModel(goods.getBrandId());
        //分类
        CategoryDO category = categoryManager.getModel(goods.getCategoryId());
        //相册
        List<GoodsGalleryDO> galleryList = goodsInfoGalleryManager.list(goodsId);

        return new GoodsSnapshotVO(goods, paramList, brand, category, galleryList);
    }

    /**
     * 查询商品列表
     *
     * @param goodsQueryParam 商品的查询条件
     * @return 查询结果
     */
    @Override
    public WebPage list(GoodsQueryParam goodsQueryParam) {
        return goodsInfoQueryManager.list(goodsQueryParam);
    }

    /**
     * 获取商品分类
     *
     * @param id 商品分类主键
     * @return Category 商品分类
     */
    @Override
    public CategoryDO getCategory(Long id) {
        return categoryManager.getModel(id);
    }

    /**
     * 校验商品运费模版是否使用
     *
     * @param templateId 运费模板id
     * @return 商品
     */
    @Override
    public GoodsDO checkShipTemplate(Long templateId) {
        return goodsManager.checkShipTemplate(templateId);
    }

    /**
     * 查询某店铺正在售卖中的商品数量
     *
     * @param sellerId 商家id
     * @return 商品数量
     */
    @Override
    public Integer countSellerGoodsNumber(Long sellerId) {
        return goodsInfoQueryManager.getSellerGoodsCount(sellerId);
    }

    /**
     * 更新指定商家的商品类型
     *
     * @param request 商品状态
     * @return 处理结果
     */
    @Override
    public Boolean updateGoodsTypeBySellerId(UpdateGoodsTypeBySellerIdRequest request) {
        try {
            goodsManager.updateGoodsType(request.getSellerId(), request.getGoodsType());
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 查询某店铺的积分商品
     *
     * @param shopId 商品id
     * @return 积分商品信息列表
     */
    @Override
    public List<GoodsDO> listPointGoods(Long shopId) {
        return goodsInfoQueryManager.getSellerGoods(shopId, GoodsTypeEnums.POINT);
    }

    /**
     * 根据商品id查询所有sku
     *
     * @param goodsId 商品id
     * @return 所有sku
     */
    @Override
    public List<GoodsSkuVO> listByGoodsId(Long goodsId) {
        return goodsSkuManager.listByGoodsId(goodsId);
    }

    /**
     * 根据商家id查询出所有的商品信息
     *
     * @param sellerId 商家id
     * @return 所有的商品信息
     */
    @Override
    public List<GoodsDO> getSellerGoods(Long sellerId) {
        return goodsInfoQueryManager.getSellerGoods(sellerId,null);
    }

    /**
     * 查询所有的分类，父子关系
     *
     * @param parentId 父类目id
     * @return 类目VO列表信息
     */
    @Override
    public List<CategoryVO> listAllChildren(Long parentId) {
        return categoryManager.listAllChildren(parentId);
    }

}
